package com.example.detectivedemo.domain.generic;

import java.util.List;
import java.util.Optional;
import java.util.UUID;

/**
 * 通用服务类
 * 封装通用的业务操作，作为所有服务的基础
 * @param <T> 实体类型
 * @param <R> Repository类型
 */
public abstract class GenericService<T extends GenericEntity, R extends GenericRepository<T>> {
    
    protected final R repository;
    
    // 构造函数
    protected GenericService(R repository) {
        this.repository = repository;
    }
    
    /**
     * 创建实体
     * @param entity 要创建的实体
     * @return 创建后的实体
     */
    public T create(T entity) {
        if (entity.getId() == null || entity.getId().isEmpty()) {
            entity.setId(generateId());
        }
        return repository.save(entity);
    }
    
    /**
     * 根据ID查询实体
     * @param id 实体ID
     * @return 实体Optional对象
     */
    public Optional<T> findById(String id) {
        return repository.findById(id);
    }
    
    /**
     * 查询所有实体
     * @return 实体列表
     */
    public List<T> findAll() {
        return repository.findAll();
    }
    
    /**
     * 根据条件查询实体列表
     * @param condition 查询条件
     * @return 实体列表
     */
    public List<T> findByCondition(String condition) {
        return repository.findByCondition(condition);
    }
    
    /**
     * 更新实体
     * @param entity 要更新的实体
     * @return 更新后的实体
     */
    public T update(T entity) {
        if (entity.getId() == null || entity.getId().isEmpty()) {
            throw new IllegalArgumentException("Entity ID cannot be empty");
        }
        return repository.update(entity);
    }
    
    /**
     * 根据ID删除实体
     * @param id 实体ID
     * @return 是否删除成功
     */
    public boolean deleteById(String id) {
        return repository.deleteById(id);
    }
    
    /**
     * 统计实体数量
     * @return 实体数量
     */
    public long count() {
        return repository.count();
    }
    
    /**
     * 批量创建实体
     * @param entities 要创建的实体列表
     * @return 创建后的实体列表
     */
    public List<T> batchCreate(List<T> entities) {
        entities.forEach(entity -> {
            if (entity.getId() == null || entity.getId().isEmpty()) {
                entity.setId(generateId());
            }
        });
        return repository.batchSave(entities);
    }
    
    /**
     * 生成唯一ID
     * @return 唯一ID字符串
     */
    protected String generateId() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }
}